﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using SGAEntidades;
using SGABDUtil;
using SGAInterfaces;

namespace SGAAccesoDatos
{
    public class ImplementacionLocal : IImplementacionLocal
    {
        #region Miembros de IImplementacionLocal

        public IList<ImplementacionLocalInfo> Listar(ImplementacionLocalInfo oImplementacionLocal)
        {
            var sqlParm = new SqlParameter[8];
            var oListaImplementacion = new List<ImplementacionLocalInfo>();

            sqlParm[0] = new SqlParameter("@Id_Implementacion", SqlDbType.VarChar);
            if (oImplementacionLocal.IdImplementacion != null)
                sqlParm[0].Value = oImplementacionLocal.IdImplementacion;
            else
                sqlParm[0].Value = DBNull.Value;

            sqlParm[1] = new SqlParameter("@Id_Local", SqlDbType.VarChar);
            if (oImplementacionLocal.IdLocal != null)
                sqlParm[1].Value = oImplementacionLocal.IdLocal;
            else
                sqlParm[1].Value = DBNull.Value;

            sqlParm[2] = new SqlParameter("@Id_Empleado_Encargado", SqlDbType.VarChar);
            if (oImplementacionLocal.IdEmpleadoEncargado != null)
                sqlParm[2].Value = oImplementacionLocal.IdEmpleadoEncargado;
            else
                sqlParm[2].Value = DBNull.Value;

            sqlParm[3] = new SqlParameter("@Fecha_Inicio_Desde", SqlDbType.DateTime);
            if (oImplementacionLocal.FechaInicioDesde.HasValue)
                sqlParm[3].Value = oImplementacionLocal.FechaInicioDesde;
            else
                sqlParm[3].Value = DBNull.Value;

            sqlParm[4] = new SqlParameter("@Fecha_Inicio_Hasta", SqlDbType.DateTime);
            if (oImplementacionLocal.FechaInicioHasta.HasValue)
                sqlParm[4].Value = oImplementacionLocal.FechaInicioHasta;
            else
                sqlParm[4].Value = DBNull.Value;

            sqlParm[5] = new SqlParameter("@Fecha_Fin_Desde", SqlDbType.DateTime);
            if (oImplementacionLocal.FechaFinDesde.HasValue)
                sqlParm[5].Value = oImplementacionLocal.FechaFinDesde;
            else
                sqlParm[5].Value = DBNull.Value;

            sqlParm[6] = new SqlParameter("@Fecha_Fin_Hasta", SqlDbType.DateTime);
            if (oImplementacionLocal.FechaFinHasta.HasValue)
                sqlParm[6].Value = oImplementacionLocal.FechaFinHasta;
            else
                sqlParm[6].Value = DBNull.Value;

            sqlParm[7] = new SqlParameter("@Id_Estado", SqlDbType.VarChar);
            if (oImplementacionLocal.IdEstado != null)
                sqlParm[7].Value = oImplementacionLocal.IdEstado;
            else
                sqlParm[7].Value = DBNull.Value;

            using (
                var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction,
                                                  CommandType.StoredProcedure, "SGA_SP_CONSULTAR_IMPLEMENTACION_LOCAL", sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oListaImplementacion.Add(new ImplementacionLocalInfo(drd.GetString(0).Trim(),
                            drd.GetString(1).Trim(), new LocalInfo(drd.GetString(1).Trim(), drd.GetString(2).Trim(), drd.GetString(3).Trim(), null, null, null, null, null, null, null, null, null, null,
                                null, null, null, null, null, null, null, null, null, null, null, null),
                            drd.GetString(4).Trim(), new EmpleadoInfo(drd.GetString(4).Trim(), drd.GetString(5).Trim(), drd.GetString(10).Trim(),
                                new AreaEmpleadoInfo(drd.GetString(10).Trim(), drd.GetString(11).Trim(), null), null, null),
                            drd.GetDateTime(6), drd.GetDateTime(7), drd.GetString(8).Trim(), null, drd.GetString(9).Trim(), null, null
                            ));
                        }
                    }
                }
            }
            return oListaImplementacion;
        }

        public ImplementacionLocalInfo Consultar(ImplementacionLocalInfo oImplementacionLocal)
        {
            var sqlParm = new SqlParameter[8];
            var oEntImplementacion = new ImplementacionLocalInfo();

            sqlParm[0] = new SqlParameter("@Id_Implementacion", SqlDbType.VarChar);
            if (oImplementacionLocal.IdImplementacion != null)
                sqlParm[0].Value = oImplementacionLocal.IdImplementacion;
            else
                sqlParm[0].Value = DBNull.Value;

            sqlParm[1] = new SqlParameter("@Id_Local", SqlDbType.VarChar);
            if (oImplementacionLocal.IdLocal != null)
                sqlParm[1].Value = oImplementacionLocal.IdLocal;
            else
                sqlParm[1].Value = DBNull.Value;

            sqlParm[2] = new SqlParameter("@Id_Empleado_Encargado", SqlDbType.VarChar);
            if (oImplementacionLocal.IdEmpleadoEncargado != null)
                sqlParm[2].Value = oImplementacionLocal.IdEmpleadoEncargado;
            else
                sqlParm[2].Value = DBNull.Value;

            sqlParm[3] = new SqlParameter("@Fecha_Inicio_Desde", SqlDbType.DateTime);
            if (oImplementacionLocal.FechaInicioDesde.HasValue)
                sqlParm[3].Value = oImplementacionLocal.FechaInicioDesde;
            else
                sqlParm[3].Value = DBNull.Value;

            sqlParm[4] = new SqlParameter("@Fecha_Inicio_Hasta", SqlDbType.DateTime);
            if (oImplementacionLocal.FechaInicioHasta.HasValue)
                sqlParm[4].Value = oImplementacionLocal.FechaInicioHasta;
            else
                sqlParm[4].Value = DBNull.Value;

            sqlParm[5] = new SqlParameter("@Fecha_Fin_Desde", SqlDbType.DateTime);
            if (oImplementacionLocal.FechaFinDesde.HasValue)
                sqlParm[5].Value = oImplementacionLocal.FechaFinDesde;
            else
                sqlParm[5].Value = DBNull.Value;

            sqlParm[6] = new SqlParameter("@Fecha_Fin_Hasta", SqlDbType.DateTime);
            if (oImplementacionLocal.FechaFinHasta.HasValue)
                sqlParm[6].Value = oImplementacionLocal.FechaFinHasta;
            else
                sqlParm[6].Value = DBNull.Value;

            sqlParm[7] = new SqlParameter("@Id_Estado", SqlDbType.VarChar);
            if (oImplementacionLocal.IdEstado != null)
                sqlParm[7].Value = oImplementacionLocal.IdEstado;
            else
                sqlParm[7].Value = DBNull.Value;

            using (
                var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction,
                                                  CommandType.StoredProcedure, "SGA_SP_CONSULTAR_IMPLEMENTACION_LOCAL", sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        drd.Read();

                        oEntImplementacion = new ImplementacionLocalInfo(drd.GetString(0).Trim(),
                            drd.GetString(1).Trim(), new LocalInfo(drd.GetString(1).Trim(), drd.GetString(2).Trim(), drd.GetString(3).Trim(), null, null, null, null, null, null, null, null, null, null,
                                null, null, null, null, null, null, null, null, null, null, null, null),
                            drd.GetString(4).Trim(), new EmpleadoInfo(drd.GetString(4).Trim(), drd.GetString(5).Trim(), drd.GetString(10).Trim(), 
                                new AreaEmpleadoInfo(drd.GetString(10).Trim(), drd.GetString(11).Trim(), null) , null, null),
                            drd.GetDateTime(6), drd.GetDateTime(7), drd.GetString(8).Trim(), null, drd.GetString(9).Trim(), null, null
                            );

                    }
                }
            }
            return oEntImplementacion;
        }

        public bool Registrar(ImplementacionLocalInfo oImplementacionLocal, ref string sIdImplementacion)
        {
            var bExito = false;
            var sqlParm = new SqlParameter[8];

            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Id_Local", SqlDbType.VarChar);
                    if (oImplementacionLocal.IdLocal != null)
                        sqlParm[0].Value = oImplementacionLocal.IdLocal;
                    else
                        sqlParm[0].Value = DBNull.Value;

                    sqlParm[1] = new SqlParameter("@Id_Empleado_Encargado", SqlDbType.VarChar);
                    if (oImplementacionLocal.IdEmpleadoEncargado != null)
                        sqlParm[1].Value = oImplementacionLocal.IdEmpleadoEncargado;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Fecha_Inicio", SqlDbType.DateTime);
                    if (oImplementacionLocal.FechaInicio.HasValue)
                        sqlParm[2].Value = oImplementacionLocal.FechaInicio;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Fecha_Fin", SqlDbType.DateTime);
                    if (oImplementacionLocal.FechaFin.HasValue)
                        sqlParm[3].Value = oImplementacionLocal.FechaFin;
                    else
                        sqlParm[3].Value = DBNull.Value;

                    sqlParm[4] = new SqlParameter("@Id_Estado", SqlDbType.VarChar);
                    if (oImplementacionLocal.IdEstado != null)
                        sqlParm[4].Value = oImplementacionLocal.IdEstado;
                    else
                        sqlParm[4].Value = DBNull.Value;

                    sqlParm[5] = new SqlParameter("@Observaciones", SqlDbType.VarChar);
                    if (oImplementacionLocal.Observaciones != null)
                        sqlParm[5].Value = oImplementacionLocal.Observaciones;
                    else
                        sqlParm[5].Value = DBNull.Value;

                    sqlParm[6] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oImplementacionLocal.UsuarioSistema != null)
                        sqlParm[6].Value = oImplementacionLocal.UsuarioSistema;
                    else
                        sqlParm[6].Value = DBNull.Value;

                    sqlParm[7] = new SqlParameter("@Id", SqlDbType.VarChar, 10) { Direction = ParameterDirection.Output };
                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_REGISTRAR_IMPLEMENTACION_LOCAL", sqlParm);

                    sIdImplementacion = sqlParm[7].Value.ToString();
                    var oImplementacionDetalle = new ImplementacionLocalDetalle();

                    foreach (var oDetalle in oImplementacionLocal.Detalle)
                    {
                        oDetalle.IdImplementacion = sIdImplementacion;
                        oDetalle.UsuarioSistema = oImplementacionLocal.UsuarioSistema;
                        if (!oImplementacionDetalle.Registrar(oDetalle, trx))
                        {
                            break;
                        }
                        else
                        {
                            bExito = true;
                        }
                    }

                    if (bExito)
                    {
                        trx.Commit();
                    }
                    else
                    {
                        trx.Rollback();
                    }

                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return bExito;
        }

        public bool Actualizar(ImplementacionLocalInfo oImplementacionLocal)
        {
            var bExito = false;
            var sqlParm = new SqlParameter[8];

            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {

                    sqlParm[0] = new SqlParameter("@Id_Implementacion", SqlDbType.VarChar);
                    if (oImplementacionLocal.IdImplementacion != null)
                        sqlParm[0].Value = oImplementacionLocal.IdImplementacion;
                    else
                        sqlParm[0].Value = DBNull.Value;

                    sqlParm[1] = new SqlParameter("@Id_Local", SqlDbType.VarChar);
                    if (oImplementacionLocal.IdLocal != null)
                        sqlParm[1].Value = oImplementacionLocal.IdLocal;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Id_Empleado_Encargado", SqlDbType.VarChar);
                    if (oImplementacionLocal.IdEmpleadoEncargado != null)
                        sqlParm[2].Value = oImplementacionLocal.IdEmpleadoEncargado;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Fecha_Inicio", SqlDbType.DateTime);
                    if (oImplementacionLocal.FechaInicio.HasValue)
                        sqlParm[3].Value = oImplementacionLocal.FechaInicio;
                    else
                        sqlParm[3].Value = DBNull.Value;

                    sqlParm[4] = new SqlParameter("@Fecha_Fin", SqlDbType.DateTime);
                    if (oImplementacionLocal.FechaFin.HasValue)
                        sqlParm[4].Value = oImplementacionLocal.FechaFin;
                    else
                        sqlParm[4].Value = DBNull.Value;

                    sqlParm[5] = new SqlParameter("@Id_Estado", SqlDbType.VarChar);
                    if (oImplementacionLocal.IdEstado != null)
                        sqlParm[5].Value = oImplementacionLocal.IdEstado;
                    else
                        sqlParm[5].Value = DBNull.Value;

                    sqlParm[6] = new SqlParameter("@Observaciones", SqlDbType.VarChar);
                    if (oImplementacionLocal.Observaciones != null)
                        sqlParm[6].Value = oImplementacionLocal.Observaciones;
                    else
                        sqlParm[6].Value = DBNull.Value;

                    sqlParm[7] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oImplementacionLocal.UsuarioSistema != null)
                        sqlParm[7].Value = oImplementacionLocal.UsuarioSistema;
                    else
                        sqlParm[7].Value = DBNull.Value;

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_ACTUALIZAR_IMPLEMENTACION_LOCAL", sqlParm);

                    var oImplementacionDetalle = new ImplementacionLocalDetalle();

                    foreach (var oDetalle in oImplementacionLocal.Detalle)
                    {
                        oDetalle.UsuarioSistema = oImplementacionLocal.UsuarioSistema;
                        if (!oImplementacionDetalle.Registrar(oDetalle, trx))
                        {
                            break;
                        }
                        else
                        {
                            bExito = true;
                        }
                    }

                    if (bExito)
                    {
                        trx.Commit();
                    }
                    else
                    {
                        trx.Rollback();
                    }

                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return bExito;
        }

        #endregion
    }
}
